#ifndef _SDL_JEU
#define _SDL_JEU

#include "Jeu.h"
#include "SDL.h"
#include "SDL_image.h"
#include "Flechesdeplacement.h"

struct ssdljeu
{
	Jeu * jeu;
	Image * image;
};
typedef struct ssdljeu sdljeu;

/* Procédure : InitialisationSdlJeu 
Précondition : sj alloué
Postcondition : initialise la structure sdljeu, alloue la structure Jeu avant de l'initialiser, alloue la structure image avant de l'initialiser 
Paramètre en mode donnée-résultat : sj */
void InitialisationSdlJeu (sdljeu * sj);


/* Procédure : DestructionSdlJeu 
Précondition : sj bien initialisé
Postcondition : libère la structure Jeu et la structure image apres les avoir détruit
Paramètre en mode donnée-résultat : sj */
void DestructionSdlJeu (sdljeu * sj);


/* Procédure : BoucleSdlJeu 
Précondition : sj bien initialisé
Postcondition : est la boucle principale de SDL_Jeu
Paramètre en mode donnée-résultat : sj */
void BoucleSdlJeu (sdljeu * sj);


/* Procédure : AffichageTerrainSdlJeu 
Précondition : sj bien initialisé, ecran bien initialisé
Postcondition : affiche le Terrain de la structure Jeu 
Paramètre en mode donnée-résultat : sj et ecran */
void AffichageTerrainSdlJeu (sdljeu * sj,SDL_Surface * ecran,int xspec, int yspec);


/* Procédure : ChoixCasesSdlJeu 
Précondition : sj, ecran bien initialisés, 0<=j<(*t).dimx, 0<=i<(*t).dimy 
Postcondition : regarde le contenu de la case chosie par le joueur 
	        si elle est sur une unite, on passe à DeplacementUniteSdlJeu
	        si elle est sur une maison, on passe à UsineSdlJeu 
	        sinon on revient à BoucleSdlJeu 
Paramètre en mode donnée : i ,j
Paramètre en mode donnée-résultat : sj, ecran */
void ChoixCasesSdlJeu (sdljeu * sj, SDL_Surface * ecran, int i, int j);


/* Procédure : DeplacementUniteSdlJeu 
Précondition : sj, ecran bien initialisés,  0<=x<(*t).dimx, 0<=y<(*t).dimy 
Postcondition : permet à l'utilisateur de choisir le déplacement de son unité 
	        et de lui demander de faire une action (couper du bois, pécher, combattre) 
Paramètre en mode donnée : x, y
Paramètre en mode donnée-résultat : sj, ecran */
void DeplacementUniteSdlJeu (sdljeu * sj, SDL_Surface * ecran, int x, int y);


/* Procédure : TrajetPossible 
Précondition : sj, fl, possibilite, casesdep bien initialisés, 0<=x<(*t).dimx, 0<=y<(*t).dimy 
Postcondition : définit le trajet que l'unité va faire entre la case où elle se trouve et la case 
         	où la souris du joueur va etre.
	        pour cela, on complete un tableau dynamique de structure FlechesDeplacement 
Paramètre en mode donnée : x, y, max
Paramètre en mode donnée-résultat : fl, possibilite, sj, nbfleche, casesdep, nbcasedep */
void TrajetPossible (FlechesDeplacement * fl,int * possibilite, sdljeu * sj, int x, int y, int * nbfleche, int max,int * casesdep, int * nbcasedep);


/* Procédure : ajoutfleche 
Préconditions : fl bien initialisé, 0<=x<(*t).dimx, 0<=y<(*t).dimy
Postconditions : ajoute une fleche dans le tableau dynamique de structure FlechesDeplacement 
Paramètre en mode donnée : nb, x, y cote 
Paramètre en mode donnée-résultat : fl */
void ajoutfleche (FlechesDeplacement * fl,int nb, int x,int y,int cote);


/* Procédure : AffichageFleche 
Précondition : sj, fl, ecran bien initialisés
Postcondition : affiche les fleches dont la position est défint par le tableau dynamique de structure FlechesDeplacement
Paramètre en mode donnée : nbfleche
Paramètre en mode donnée-résultat : sj, fl, ecran */
void AffichageFleche (sdljeu * sj,FlechesDeplacement * fl,int nbfleche,SDL_Surface * ecran);


/* Procédure : UsineSdlJeu 
Précondition : sj, ecran bien initialisés
Postcondition : affiche un menu au joueur
	        Le joueur peut choisir soit de construire une unité s'il a assez de nourriture soit de revenir en arrière 
Paramètre en mode donnée : x, y
Paramètre en mode donnée-résultat : sj, ecran */
void UsineSdlJeu (sdljeu * sj,SDL_Surface * ecran,int x,int y);


/* Fonction : MenuPrincipal -> entier 
Précondition : sj, ecran bien initialisés
Postcondition : Affichage du menu principal
	        Le joueur peut choisir de commencer une partie, de charger sa dernière partie sauvegardée, d'aller dans les
		options, ou de quitter le jeu 
Paramètre en mode donnée-résultat : sj, ecran*/
int MenuPrincipal(sdljeu * sj, SDL_Surface * ecran);


/* Fonction : MenuPrincipal2 -> entier
Précondition : sj et ecran bien initialisés
Postcondition : Affichage du menu secondaire si le joueur fait une nouvelle partie.
	        Le joueur aura le choix entre les différents modes de jeu, et différentes map qui vont etre chargées et 
	        prévisualisées 
Paramètre en mode donnée-résultat : sj, ecran */
int MenuPrincipal2(sdljeu * sj, SDL_Surface * ecran);


/* Procédure : AffichageTerrainSdlJeu2
Précondition : sj et ecran bien initialisés
Postcondition : Permet de prévisualiser la map que le joueur choisit
Paramètre en mode donnée-résultat : sj, ecran */ 
void AffichageTerrainSdlJeu2 (sdljeu * sj,SDL_Surface * ecran);


/* Procédure : RechercherPositionCurseurSdlJeu 
Précondition : 0<=x<(*t).dimx, 0<=y<(*t).dimy, 0<=xsouris<1000, 0<=ysouris<500 
Postcondition : permet de rechercher la position du curseur en fonction des coordonnées de la souris 
Paramètre en mode donnée : xsouris, ysouris 
Paramètre en mode donnée-résultat : x, y */
void RechercherPositionCurseurSdlJeu (int* x,int* y,int xsouris,int ysouris);


/* Procédure : AffichageImageSdlJeu 
Précondition : img, ecran bien initialisés, 0<=x<(*t).dimx, 0<=y<(*t).dimy
Postcondition : permet d'afficher une image sur l'écran à la position x,y
Paramètre en mode donnée : x, y
Paramètre en mode donnée-résultat : img, ecran */
void AffichageImageSdlJeu (SDL_Surface * img, SDL_Surface * ecran, int x, int y);


/* Procédure : AffichagePossibilite 
Précondition : sj, ecran, possibilite bien initialisés, 0<=x<(*t).dimx, 0<=y<(*t).dimy
Postcondition : Affichage des cases où l'unité sélectionner peut se déplacer.  
		Ceci est possible grâce au tableau d'entiers possiblite 
Paramètre en mode donnée: x, y
Paramètre en mode donnée-résultat: sj, ecran, possibilite */
void AffichagePossibilite (sdljeu * sj, SDL_Surface * ecran, int * possibilite, int x, int y);


/* Procédure : AGagner 
Précondition : sj et ecran bien initialisés
Postcondition : affichage du joueur vainqueur 
Paramètre en mode donnée-résultat : sj, ecran */
void AGagner(sdljeu * sj,SDL_Surface * ecran);


/* Procédure animationDeplacement
Précondition : sj, ecran, casesdep bien initialisés, 0<=x<(*t).dimx, 0<=y<(*t).dimy, 0<=x2<(*t).dimx, 0<=y2<(*t).dimy
Postcondition : Déplacement d'une unité sélectionnée
Paramètre en mode donnée : x, y, x2, y2, nbcasedep
Paramètre en mode donnée-résultat : sj, ecran, casesdep */
void animationDeplacement (sdljeu * sj,SDL_Surface * ecran, int x, int y, int x2, int y2,int * casesdep, int nbcasedep);


/* Procédure : animationCoupeArbre
Précondition : sj, ecran bien initialisés, 0<=x<(*t).dimx, 0<=y<(*t).dimy
Postcondition : Animation montrant que l'arbre sélectionné est en train d'être coupé
Paramètre en mode donnée : x, y
Paramètre en mode donnée-résultat : sj, ecran */
void animationCoupeArbre (sdljeu * sj,SDL_Surface * ecran, int x, int y);


/* Procédure : animationPeche 
Précondition : sj, ecran bien initialisés, 0<=x<(*t).dimx, 0<=y<(*t).dimy
Postcondition : Animation montrant des ondes dans l'eau (en référence à la canne à pêche)
Paramètre en mode donnée-résultat : sj, ecran
Paramètre en mode donnée : x, y */
void animationPeche (sdljeu * sj,SDL_Surface * ecran, int x, int y);


/* Procédure : animationCombat
Précondition : sj, ecran bien initialisés, 0<=x<(*t).dimx, 0<=y<(*t).dimy, 0<=x2<(*t).dimx, 0<=y2<(*t).dimy
Postcondition : Affichage d'une pop-up montrant les deux unités impliquées dans le combat, avec les jauges de vie qui diminuent
Paramètre en mode donnée : x, y, x2, y2
Paramètre en mode donnée-résultat : sj, ecran */
void animationCombat(sdljeu * sj,SDL_Surface * ecran, int x, int y, int x2, int y2);


/* Fonction : MenuOption -> entier
Précondition : sj, ecran bien initialisés
Postcondition : Affichage du menu d'options : Editeur map,  musique du jeu, bruitage du jeu. Renvoie 1 pour jouer, et 0 sinon
Paramètre en mode donnée-résultat : sj, ecran */
int MenuOption (sdljeu * sj,SDL_Surface * ecran);


/* Fonction : MenuEditeurMap -> entier
Précondition : sj, ecran bien initialisés
Postcondition : Affichage des map construites ou à construire. Renvoie 1 pour jouer et 0 sinon.
Paramètre en mode donnée-résultat : sj, ecran */
int MenuEditeurMap (sdljeu * sj,SDL_Surface * ecran);


/* Procédure : EditeurMap
Précondition : sj, ecran bien initialisés
Postcondition : Construction possible d'une map grace au glisser-déposer des unités présentées dans une barre d'outils
Paramètre en mode donnée-résultat : sj, ecran
Paramètre en mode donnée : nomfic */
void EditeurMap (sdljeu * sj,SDL_Surface * ecran,const char * nomfic);

/* Procédure : Generiquefin
Précondition : sj, ecran bien initialisés
Postcondition : Affiche un générique de fin 
Paramètre en mode donnée: sj, ecran */
void Generiquefin (sdljeu * sj,SDL_Surface * ecran);

#endif